package com.masterlu.leetcode.daily.stack.simple;

import java.util.Stack;

/**
 * 有效括号
 * https://leetcode-cn.com/problems/valid-parentheses/
 *
 * @Author：masterlu
 * @Date：2021/4/22 9:51 上午
 */
public class S20Valid {

    /**
     * 使用 stack实现
     * 1.将字符串第一个字符，存放到栈结构中。初始化栈
     * 2。利用右侧括号为主线判断。
     * 当前符号如果为右括号，如果能匹配，则栈不能为空。
     * 当前符号如果为右括号，理论上栈中，有对应的左括号对应
     *
     * @param s
     * @return
     */
    public boolean isValid(String s) {

        if (null == s || s.length() % 2 == 1) {
            return Boolean.TRUE;
        }
        //1.将字符串，存储在栈结构中
        Stack<Character> characters = new Stack<>();
        char[] chars = s.toCharArray();
        characters.push(chars[0]);
        for (int i = 1; i < chars.length; i++) {
            switch (chars[i]){
                case '}':
                    if (characters.isEmpty()){
                        return Boolean.FALSE;
                    }
                    if (Character.compare('{',characters.peek())==0){
                        characters.pop();
                    }else {
                        return Boolean.FALSE;
                    }
                    break;
                case ']':
                    if (characters.isEmpty()){
                        return Boolean.FALSE;
                    }
                    if (Character.compare('[',characters.peek())==0){
                        characters.pop();
                    }else {
                        return Boolean.FALSE;
                    }
                    break;
                case ')':
                    if (characters.isEmpty()){
                        return Boolean.FALSE;
                    }
                    if (Character.compare('(',characters.peek())==0){
                        characters.pop();
                    }else {
                        return Boolean.FALSE;
                    }
                    break;
                default:
                    characters.push(chars[i]);
            }
        }
        //2.对比括号有效性。
        if (characters.isEmpty()) {
            return Boolean.TRUE;
        }
        return Boolean.FALSE;
    }


}
